/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package powierzchnie1;

import gra.TVisualisation;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import nor.TPoint;
import out.IOut;
import ste.TAbstBlock;

/**
 *
 * @author Arek
 */
public class Powierzchnie1Main extends TAbstBlock {

    double maxDopuszczalnaOdleglosc = 0.2; //metry
    double maxDopuszczalnyKat = 0.1; //radiany
    int minLiczbaPunktowDlaZbioru = 3; //sztuki
    Graphics graphicsObrazek = null;
    ArrayList<TPoint[]> daneWej = null;
    ArrayList<ZbiorPunktow> tabZiorow = new ArrayList<ZbiorPunktow>();
    private PowierzchniePanel panel;

    /**
     * funkcja pobiera dane do dalszej obrobki. I przypisuje do odpowiedniej zmiennej
     * @param arTPtab
     */
    public void setPtTAL(ArrayList<TPoint[]> arTPtab) {
        this.daneWej = arTPtab;
    }

    @Override
    public void finish() {
        //this.generujPlikObrazka();
        int liczbaZerowych = 0;
        int liczbaZerowychNor = 0;
        long czasStart = System.currentTimeMillis();

      ///  if (this.tabZiorow.size() == 0)
      ///      this.utworzPierwszyZbior();
        this.tabZiorow.add( new ZbiorPunktow( this.daneWej.get(0)[0] )  );

        for (TPoint[] tabTPoint : this.daneWej) {
            for (TPoint P : tabTPoint) {

                for (ZbiorPunktow zbior : this.tabZiorow) {
                    try {

                        if (zbior.dodac(P)) {
                            this.tabZiorow.add(new ZbiorPunktow(P));
                            break;
                        }
                    } catch (PunktZerowyException ex) {
                        System.err.println("::PunktZerowy. " + liczbaZerowych++ +" szt.");
                        
                    } catch (ZerowyWektorNormalnyException ex) {
                        System.err.println("::PunktZerowyNor. " + liczbaZerowychNor++ +" szt.");
                    }
                }//for zbior


            }//for P
        }//for tabTPoint


        long czasStop = System.currentTimeMillis();

        System.out.println("Całkowity czas: " + (czasStop - czasStart));
        System.err.println("::PunktZerowy. " + liczbaZerowych +" szt.");
        System.err.println("::PunktZerowyNor. " + liczbaZerowychNor++ +" szt.");
        
    }

    @Override
    public void checkSettings() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void showGraphic() {
        System.out.println("!-!-! public void showGraphic() !-!-! !-!-! ");
        System.out.println("Rozmiar tablicy: " + this.tabZiorow.size());

        TVisualisation _lVis = new TVisualisation(); //do grafiki

        Collections.sort(this.tabZiorow);

        Color kMax = new Color(200, 200, 200);
        int min = Math.min(1000000, this.tabZiorow.size());

        for (int i = 0; i < min; i++) {
            ZbiorPunktow so = this.tabZiorow.get(i);
            Color kObsz = new Color(i * kMax.getRGB() / this.tabZiorow.size());
            so.setColor(kObsz);
            _lVis.addPtNorT(so.getAL().toArray(new TPoint[so.size()]));


        }

        _lVis.display();


    }

    @Override
    public void clear() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void starter(IOut o) {
        System.err.println("!!!Nie uzywane!!!");
    }

    void setCzyDopasowywac(boolean selected) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
    //======================================================
    //  metody GET i SET
    //======================================================
    void setMaxKatStopnie(int kat) {
        this.maxDopuszczalnyKat = kat;
    }

    void setMinOdlegosc(double odl) {
        this.maxDopuszczalnaOdleglosc = odl;
    }

    void setProg(int prog) {
        this.minLiczbaPunktowDlaZbioru = prog;
    }

    void setGraphicsObrazek(Graphics gg) {
        this.graphicsObrazek = gg;
    }

    @Override
    public String getTabTitle() {
        return "Powierzchnie etap 1A";
    }

    @Override
    public JComponent getJComponent() {
        this.panel = new PowierzchniePanel(this);
        return this.panel;
    }

    @Override
    public void setNext(TAbstBlock aNext) {
    }

    private void generujPlikObrazka() {
        int maxY = this.daneWej.size();
        int maxX = this.daneWej.get(1).length;
        BufferedImage bi = new BufferedImage(maxX, maxY, BufferedImage.TYPE_INT_RGB);
        Graphics gg = bi.getGraphics();
        Graphics g = this.panel.getGraphicsPanelObrazek();
        for (int x = 0; x < this.daneWej.size(); x++) {
            TPoint[] tabP = this.daneWej.get(x);
            for (int y = 0; y < tabP.length; y++) {
                TPoint p = tabP[y];
                gg.setColor(p.getPrawdziwyKolor());
                gg.drawLine(y, x, y, x);

                g.setColor(p.getPrawdziwyKolor());
                g.drawLine(y, x, y, x);

            }
        }

        JFileChooser jfc = new JFileChooser();
        jfc.showSaveDialog(panel);
        try {

            ImageIO.write(bi, "png", jfc.getSelectedFile());
        } catch (IOException ex) {
            Logger.getLogger(Powierzchnie1Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }//

    private void utworzPierwszyZbior() {
        
        //przeszukujemy pokolei punkty tak by znalesc ten jede startowy
        for (TPoint[] tabTPoint : this.daneWej) {
            for (TPoint P : tabTPoint) {

                if (P.x != 0.0 || P.y != 0 || P.z != 0) {
                    if (P.getNorVec().x != 0 || P.getNorVec().y != 0 || P.getNorVec().z != 0)
                        this.tabZiorow.add(new ZbiorPunktow(P));
                    return;
                }
            }
        }
        
        
    }//
    }//klasa
